import os
from openai import OpenAI

api_key = 'sk-5632e6e21f5d4517afd89d5ff4d1beef'

def analyze_video_frames(image_paths):
    """
    分析视频帧并生成分镜脚本
    """
    client = OpenAI(
        api_key=api_key,
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    print(f'图片长度{len(image_paths)}')
    completion = client.chat.completions.create(
        model="qwen-vl-max-latest",
        messages=[{"role": "user", "content": [
            {
                "type": "video",
                "video": image_paths
                # "video":[
                #   "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/xzsgiz/football1.jpg",
                #            "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg",
                #            "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg",
                #            "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg"
                # ]
            },
            {
                "type": "text", 
                # "text": f"该视频总时长是：{len(image_paths)},请依次对视频的每秒的画面进行内容分析,按秒进行划分,返回markdown表格"
                # "text": "你是一位专业的视频分镜脚本工程师，专注于为各大短视频平台打造爆款视频脚本。你将对视频每秒的画面从图片、 时段、场景、景别、角色描述、台词/字幕、画面描述 、 商品描述 等这些维度进行内容分析。请确保视频每秒都被分析并且台词要准确,最后制作出一个分镜视频脚本，脚本呈现形式为符合Markdown格式要求的表格形式。"
                # "text": f"该视频总时长是：{len(image_paths)},请仔细对视频每秒的画面从时段(不能超过视频总时长)、场景、景别、角色描述、台词/字幕、画面描述 、 商品描述 等维度进行内容理解，确保画面描述、角色描述、台词、时段之间的内容分析准确，最后返回分镜视频脚本markdown表格"
                "text":f"该视频总时长是：{len(image_paths)-1}s,你需要严格以秒为单位，按照时段（不能超过视频总时长）、场景、景别、角色描述、台词/字幕、画面描述 、 商品描述 等维度，对视频每秒的画面进行细致分析。例如时段需精确到1s、2s 等这样每秒的区间。2. 务必保证画面描述、角色描述、台词、时段之间的内容分析精准无误。3. 将分析结果整理成分镜视频脚本 markdown 表格，格式如下：|时段|场景|景别|角色描述|台词/字幕|画面描述|商品描述||---|---|---|---|---|---|---||1s|客厅|全景|一位年轻女生或者男生端正地坐在沙发上，身着简约休闲装，坐姿放松|无|阳光恰好透过窗户，微弱地洒在客厅角落，家具摆放得十分整齐|无||2s|客厅|全景|女生或者男生身体微微前倾，似乎在准备起身，休闲装有些许褶皱|无|阳光在地面上的光影微微移动，客厅的布置清晰可见|无|（以此类推，根据实际分析内容填写表格，确保时段为每秒的准确区间）"
                # "text":f"你需要严格以秒为单位，按照时段（不能超过视频总时长）、场景、景别、角色描述、台词/字幕、画面描述 、 商品描述 等维度，对视频每秒的画面进行细致分析。例如时段需精确到1s、2s 等这样每秒的区间。2. 务必保证画面描述、角色描述、台词、时段之间的内容分析精准无误。3. 将分析结果整理成分镜视频脚本 markdown 表格，格式如下：|时段|场景|景别|角色描述|台词/字幕|画面描述|商品描述||---|---|---|---|---|---|---||1s|客厅|全景|一位年轻女生或者男生端正地坐在沙发上，身着简约休闲装，坐姿放松|无|阳光恰好透过窗户，微弱地洒在客厅角落，家具摆放得十分整齐|无||2s|客厅|全景|女生或者男生身体微微前倾，似乎在准备起身，休闲装有些许褶皱|无|阳光在地面上的光影微微移动，客厅的布置清晰可见|无|（以此类推，根据实际分析内容填写表格，确保时段为每秒的准确区间）"
            }
        ]},
        ],
      #  response_format={"type": "json_object"},
        temperature = 0,
        presence_penalty  = 2,
        max_tokens  = 	8192,
    )
    return completion.choices[0].message.content


def analyze_video_frames_v2(image_paths,duration):
    """
    分析视频帧并生成分镜脚本
    """

    client = OpenAI(
        api_key=api_key,
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    print(f'图片长度{len(image_paths)}')
    completion = client.chat.completions.create(
        model="qwen-vl-max-latest",
        messages=[{"role": "user", "content": [
            {
                # "type": "video",
                # "video": image_paths

                "type": "video_url",
                "video_url": {"url":image_paths}
                # "video":[
                #   "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/xzsgiz/football1.jpg",
                #            "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg",
                #            "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg",
                #            "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg"
                # ]
            },
            {
                "type": "text", 
                "text": f"该视频总时长{duration}s,你是一位专业的视频分镜脚本工程师，专注于为各大短视频平台打造爆款视频脚本。你将对视频画面从 时段(比如1s-3s)、场景、景别、角色描述、台词/字幕(比如：1-3s中出现的台词字幕都需要记录)、画面描述 、 商品描述 等这些维度进行内容分析。请确保视频每秒都被分析并且台词要准确,最后制作出一个分镜视频脚本，将分析结果整理成分镜视频脚本 markdown 表格，格式如下：|时段|场景|景别|角色描述|台词/字幕|画面描述|商品描述||---|---|---|---|---|---|---||1s|客厅|全景|一位年轻女生或者男生端正地坐在沙发上，身着简约休闲装，坐姿放松|无|阳光恰好透过窗户，微弱地洒在客厅角落，家具摆放得十分整齐|无||2s|客厅|全景|女生或者男生身体微微前倾，似乎在准备起身，休闲装有些许褶皱|无|阳光在地面上的光影微微移动，客厅的布置清晰可见|无|（以此类推，根据实际分析内容填写表格，确保时段为每秒的准确区间）"
            }
        ]},
        ],
      #  response_format={"type": "json_object"},
        temperature = 0,
        presence_penalty  = 2,
        max_tokens  = 	8192,
    )

    return completion.choices[0].message.content

def deepseek_r1(messages, stream=True):
    """
    使用 deepseek-r1 模型进行对话，支持流式输出
    """
    client = OpenAI(
        # api_key=api_key,
        api_key='sk-844a3b5172c642228b0be9e3f4fd394b',
        base_url="https://api.deepseek.com"
        # base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    # messages=[
    #     {"role": "user", "content": content}
    # ]

    completion = client.chat.completions.create(
        # model="deepseek-r1",
        model="deepseek-reasoner",
        messages=messages,
        stream=stream
    )

    if stream:
        def generate():
            for chunk in completion:
                if not chunk.choices:
                    continue
                    
                delta = chunk.choices[0].delta
                if hasattr(delta, 'reasoning_content') and delta.reasoning_content:
                    yield {
                        'type': 'reasoning',
                        'content': delta.reasoning_content
                    }
                elif delta.content:
                    yield {
                        'type': 'answer',
                        'content': delta.content
                    }
            # 在所有内容输出完后，发送完成标记
            yield {
                'type': 'done',
                'content': ''
            }
        return generate()
    message = completion.choices[0].message
    reasoning_content = message.reasoning_content
    answer_content = message.answer_content
    return reasoning_content, answer_content




